class Person {
  String name;
  int age;
  
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}
class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}
class Person {
  String name;
  int age;
  // 基本構造函數
  Person(this.name, this.age);
  // 命名構造函數
  Person.guest() {
    name = 'Guest';
    age = 18;
  }
  // 使用初始化列表的命名構造函數
  Person.adult(this.name) : age = 18;
  
  // 工廠構造函數
  factory Person.fromData(Map<String, dynamic> data) {
    if (data['age'] >= 18) {
      return Person.adult(data['name']);
    } else {
      return Person(data['name'], data['age']);
    }
  }
  
}
其中上面 Person.adult 建構子搭配使用的 : ,這個在建構子後面的「冒號」叫做 Initializer List 初始化列表。在這邊可以使用 , 組織一些表達式 Expression,主要用於執行一些初始化操作。這對於設定 final 變數特別有用。
assert(...),便於檢查參數值class Person {
  // final 是為了宣告一個不可變動,和 const 的差別為時間點
  // const 在編譯就固定了
  // final 在執行時期
  final String name;
  final int age;
  final String comment;
  
  Person(this.name, this.age): comment = '${name} 目前 ${age} 歲';
}
class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}
class Developer extends Person {
  String skill;
  
  Developer(String name, int age, String skill): super(name, age);
}
// ⚠️ super 和初始化列表是可以一起使用
// 顯示寫法
class Person {
  String _name;
  
  String get name => _name;
  set name(String value) => _name = value;
  
  Person(this._name);
}
// 隱式 / 自動生成的簡潔語法
// 也就是類別的每個公開欄位都自動具備隱式的 getter 和 setter。
class Person {
  String name;
  
  Person(this.name);
}
extends 實現,子類別會獲得父類別的功能可以直接使用或覆寫implements 語法實現。一個類別可以實現多個介面,必須提供介面宣告的全部方法with 實現,用於共用方法,不適合單一繼承或介面規範重複一樣的實作。class Vehicle {
  void drive() {
    print('move');
  }
}
class Car implements Vehicle {
  @override
  void drive() {
    print('move with gas');
  }
}
class ElectricCar extends Car {
  @override
  void drive() {
    print('move silently');
  }
}
mixin AutoDriving {
  void navigate() {
    print('navigating');
  }
}
class Tesla extends ElectricCar with AutoDriving {
  @override
  void drive() {
    super.drive();
    navigate();
  }
}
class Person {
  // 成員變數
  String name;
  int age;
  // 構造函數
  Person({required this.name, required this.age});
  // 命名構造函數
  Person.withDefaultName({required this.age}) : name = 'Unknown';
  // 方法
  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
  // 靜態方法
  static void describe() {
    print('This is a Person class.');
  }
  // Getter
  String get info => 'Name: $name, Age: $age';
  // Setter
  set updateName(String newName) {
    name = newName;
  }
}